package br.com.tcc.systemdx.service.beans;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import br.com.tcc.systemdx.domain.DescricaoDoenca;
import br.com.tcc.systemdx.domain.Sintoma;

/**
 * POJO usado para facilitar o trabalho de identificar geradores de conjuntos
 * com doenças semelhantes
 * @author Felipe
 *
 */
public class DoencasSemelhantesWrapper {
	private List<DescricaoDoenca> doencasSemelhantes;
	private List<Sintoma> sintomasSemelhantes;
	private List<Sintoma> sintomasFaltantes;
	
	
	public DoencasSemelhantesWrapper(DescricaoDoenca descricaoDoenca,
			List<Sintoma> sintomasSemelhantes,
			Set<Sintoma> todasManifestacoes) {
		super();
		this.doencasSemelhantes = new ArrayList<DescricaoDoenca>();
		this.doencasSemelhantes.add(descricaoDoenca);
		this.sintomasSemelhantes = sintomasSemelhantes;
		// Preenche os sintomas faltantes
		for (Sintoma sintoma : todasManifestacoes) {
			boolean sintomaFaltante = true;
			for (Sintoma sintomaSemelhante : sintomasSemelhantes) {
				if (sintomaSemelhante.atributosIguais(sintoma))
					sintomaFaltante = false;
			}
			if (sintomaFaltante) {
				if (this.sintomasFaltantes == null)
					this.sintomasFaltantes = new ArrayList<Sintoma>();
				this.sintomasFaltantes.add(sintoma);
			}
		}
	}

	public DoencasSemelhantesWrapper() {
		super();
	}

	public int getNumeroSintomasSemelhantes() {
		if (sintomasSemelhantes != null)
			return sintomasSemelhantes.size();
		return 0;
	}
	
	public int getNumeroSintomasFaltantes() {
		if (sintomasFaltantes != null) 
			return sintomasFaltantes.size();
		return 0;
	}

	public List<DescricaoDoenca> getDoencasSemelhantes() {
		return doencasSemelhantes;
	}

	public void setDoencasSemelhantes(List<DescricaoDoenca> doencasSemelhantes) {
		this.doencasSemelhantes = doencasSemelhantes;
	}

	public List<Sintoma> getSintomasSemelhantes() {
		return sintomasSemelhantes;
	}

	public void setSintomasSemelhantes(List<Sintoma> sintomasSemelhantes) {
		this.sintomasSemelhantes = sintomasSemelhantes;
	}

	public List<Sintoma> getSintomasFaltantes() {
		return sintomasFaltantes;
	}

	public void setSintomasFaltantes(List<Sintoma> sintomasFaltantes) {
		this.sintomasFaltantes = sintomasFaltantes;
	}
	
	/**
	 * Método que, dada uma doença e seus sintomas, verifica se esta é semelhante as
	 * doenças da lista, acresentando a lista em caso positivo
	 * @return true em caso positivo e false caso contrário
	 */
	public boolean isDoencaSemelhante(DescricaoDoenca doenca, List<Sintoma> sintomasDoenca) {
		if (sintomasDoenca.equals(sintomasSemelhantes)) {
			doencasSemelhantes.add(doenca);
			return true;
		}
		return false;
	}
	
	/**
	 * Dada uma lista de sintomas retorna a qtd de sintomas da lista que estão
	 * presentes nos sintomas faltantes
	 * @param sintomas
	 * @return numero de sintomas complementares
	 */
	public int numeroSintomasComplementares(List<Sintoma> sintomas) {
		int total = 0;
		for (Sintoma sintoma : sintomas) {
			for (Sintoma sintomaFaltante : sintomasFaltantes) {
				if (sintoma.atributosIguais(sintomaFaltante))
					total++;
			}
		}
		return total;
	}
	
	/**
	 * Dada uma lista de sintomas, retorna a qtd de sintomas da lista iguais aos 
	 * que estão na lista de sintomas semelhantes
	 * @param sintomas
	 * @return numero de sintomas iguais
	 */
	public int numeroSintomasIguaisSemelhantes(List<Sintoma> sintomas) {
		int total = 0;
		for (Sintoma sintoma : sintomas) {
			for (Sintoma sintomaSemelhante : sintomasSemelhantes) {
				if (sintoma.atributosIguais(sintomaSemelhante))
					total++;
			}
		}
		return total;
	}

}
